home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Interactive Reference Guide
/
C-C++ Interactive Reference Guide.iso
/
c_ref
/
csource5
/
331_01
/
block.c
< prev
next >
Wrap
Text File
|
1990-06-14
|
11KB
|
424 lines
/*
HEADER: CUG199.06;
TITLE: GED (nee QED) screen editor -- part six;
DATE: 12/15/86;
DESCRIPTION: "Block operation commands for the GED editor";
KEYWORDS: block operations;
SYSTEM: MS-DOS;
FILENAME: GED6.C;
AUTHORS: G. Nigel Gilbert, James W. Haefner, Mel Tearle, G. Osborn;
COMPILERS: Microsoft 4.0;
*/
/*
e/qed/ged screen editor
(C) G. Nigel Gilbert, MICROLOGY, 1981
August-December 1981
Modified: Aug-Dec 1984: BDS-C 'e'(vers 4.6a) to 'qe' (J.W. Haefner)
March 1985: BDS-C 'qe' to DeSmet-C 'qed' (J.W. Haefner)
May 1986: converted to ged - Mel Tearle
FILE: ged6.c
FUNCTIONS: blockpos, blockops, putpart, listfile
PURPOSE: performs block commands
*/
#include <stdio.h>
#include "ged.h"
blockpos(oldpos)
int oldpos;
{
unsigned char getkey();
char c;
int to;
do {
switch ( (c = getkey()) ) {
case DOWNKEY :
moveline(1);
break;
case UPKEY :
moveline(-1);
break;
case LEFTKEY :
movechar(-1);
break;
case RIGHTKEY :
movechar(1);
break;
case LEFTWKEY :
moveword(-1);
break;
case RIGHTWKEY :
moveword(1);
break;
case BOLKEY :
sync(0);
break;
case EOLKEY :
sync(strlen(text));
break;
case UPPAGE :
movepage(-1);
break;
case DOWNPAGE :
movepage(0);
break;
case HOMEKEY :
jumpline(lastl-cline);
break;
case BOFKEY :
jumpline(1-cline);
break;
case JUMPKEY :
dojump();
break;
case QWIKKEY :
info();
break;
case REPKEY :
repeat = YES;
dofindrep(1);
repeat = NO;
break;
case 'p' :
case 'P' :
if ( oldpos ) return PREV;
break;
case ESCKEY :
return FAIL;
default :
;
}
}
while ( c != CR );
return cline;
}
/* 'K'- key block options
* some mods to print routine - mt.
*/
blockops()
{
unsigned char getkey();
int oldcline, oldcharn, oldto, oldfrom, op;
int l, ll, line, *t, shifts, shiftx, cp;
char *txt, c, shift[LLIM];
puttext();
blankedmess = YES; /* disable time of day display */
oldcline = cline;
oldcharn = charn;
oldfrom = vbord1;
oldto = vbord2;
putmess("|Q|uit, e|X|it with save, |R|ead file, |B|lock/output operations ");
while ( (op = getlow()) != 'q' && op != 'x' && op != 'r' &&
op != 'b' && op != 'j' &&
op != ESCKEY );
if ( op == ESCKEY )
return;
putch(op);
switch (op) {
case 'q':
return('q');
break;
case 'x':
return('x');
break;
case 'r':
putmess("Wait");
return('r');
break;
case F7KEY:
return (NO);
break;
default:
/* block commands */
vbord1 = cline;
vbord2 = 0; /* use updated cline for second limit */
blocking = YES;
putline(cline, cursory, NULL); /* reverse field current line */
putmess( "Move cursor then press <return>");
if (blockpos(oldto) == FAIL) {
goto abort;
}
if ( vbord2 == PREV ) {
moveline( oldfrom-cline );
vbord1 = cline;
moveline( oldto-cline );
vbord2 = cline;
}
if (vbord2 == 0)
vbord2 = cline;
if ( vbord2 < vbord1 ) {
l = vbord2;
vbord2 = vbord1;
vbord1 = l;
}
putmess("|W|rite to file, |P|rint, |S|hift, |M|ove, |C|opy, or |D|elete block ? ");
while ((op=getlow()) != 'w' && op != 'p' && op != 's' && op != 'm'
&& op != 'c' && op != 'd' && op != ESCKEY);
switch (op) {
case ESCKEY:
goto abort;
break;
case 'w':
putmess( " File to write to? ");
if ( scans( name, FILELEN ) != ESCKEY )
if ( exists( name ) )
writefile( vbord1, vbord2, name, name );
break;
case 'p':
if ( !prnstat() )
goto abort; /* add 12/13/86 */
cleareol( 0, 0 );
putstatusline( vbord1 );
listfile( vbord1, vbord2 );
putmess( "Any |Function Key| to form feed ");
c = getkey();
if ( c >= F1KEY && c <= F10KEY )
listout( 0x0c );
break;
case 's':
charn=0;
moveline( vbord1 - cline );
putmess( "Insert or delete spaces/tabs to shift block, press <return>");
shifts = 0;
while ( (c = getkey()) != CR ) {
switch (c) {
case DELRIGHT:
if ( text[0] == ' ' || text[0] == '\t' )
deletechar(0);
break;
case ' ':
insertchar(' ');
break;
case TAB:
insertchar('\t');
break;
case ESCKEY:
goto abort;
}
shift[shifts++] = c;
sync(0);
rewrite(0);
}
puttext();
for ( l = vbord1 + 1; l <= vbord2; l++ ) {
gettext(l, charn);
for ( shiftx = 0; shiftx < shifts; shiftx++ ) {
switch( ( c = shift[shiftx] ) ) {
case DELRIGHT:
if ( *(txt=&text[0]) == ' ' || *txt == '\t' )
while ( (*txt=*(txt+1)) ) txt++;
break;
case ' ':
case TAB:
if ( (cp = strlen( text ) ) < (LLIM-1) ) {
for ( ; cp >= 0; cp-- )
text[cp+1]=text[cp];
text[0] = ( c == ' ' ? ' ': '\t' );
}
break;
}
}
altered = YES;
puttext();
}
break;
/* block delete */
case 'd':
deltp( vbord1, vbord2-vbord1+1 );
blocking = NO;
plast = -1;
moveline(vbord1-cline);
break;
/* block copy or move */
case 'm':
case 'c':
if (op == 'm')
putmess("Put cursor under |move| destination and press <return>");
else
putmess("Put cursor under |copy| destination and press <return>");
if ( (line = blockpos(0)) == FAIL ) {
break;
}
putmess("Wait");
line--;
for ( l = vbord1; l <= vbord2; l++ ) {
if ( (line = inject( line, getline(l)) ) == FAIL )
break;
if ( op == 'm' ) {
deltp( ( l < line ? l : l + 1 ), 1 );
if ( vbord2 < line ) {
vbord2--;
l--;
line--;
cline--;
}
}
else {
if (vbord2 >= line)
vbord2++;
if (l >= line)
l++;
if (l == cline)
l = line;
}
}
vbord1 = cline;
vbord2 = line;
blocking=TRUE;
calp();
if (vbord2 >= plast)
cursory += plast - vbord2 -1; /* limit checked in calp() */
plast = -1;
moveline(0); /* show the new block */
while (chkbuf() == 0)
;
blocking=FALSE; /* clear the reverse field on the first keystroke */
/* the keystroke is then used normally */
break;
}
abort:
blocking = NO;
switch (op) {
case 'w':
case 'p':
case 's':
break;
case 'd':
break;
case 'm':
case 'c':
break;
}
plast = -1;
moveline(0);
return NO;
} /* outer case */
} /* func blockops */
/* get status of parallel printer port - is the printer turned on?
* report if error
*/
prnstat()
{
rax = ( 0x02 << 8 );
rdx = 0; /* 0 = prn */
syscall();
if ( ( ( rax >> 8 ) & 0x80 ) ||
( ( rax >> 8 ) & 0x40 ) ||
( ( rax >> 8 ) & 0x10 ) )
return( 1 );
else {
putch( '\07' );
error( " error on printer " );
return( 0 );
}
}
/* printer routine
*/
listfile(from,to)
int from, to;
{
unsigned char testkey();
int cp, i, k, l;
char *t;
k = 0;
puttext();
for ( l = from; l <= to; l++, k++ ) {
curson(NO);
if ( l%10 == 0 && l > 1 ) putlineno(l);
if ( k >= PAGELEN - NLINES ) {
for ( i = k; i < PAGELEN; i++ ) {
listout('\r');
listout('\n');
}
k = 0;
}
for ( cp = 0, t = getline(l); *t; t++ )
if (*t == '\t') for (i=tabwidth-cp%tabwidth; i>0 ; cp++, i--)
listout(' ');
else {
if (*t > 0x19) listout(*t); /* send some ctrl char */
else { /* for OKI & CITOH */
switch (*t) {
case (0x08):
case (0x0a):
case (0x0c):
case (0x0d):
case (0x18):
listout(*t);
break;
default:
{
listout('^');
listout(*t+64);
}
}
}
cp++;
}
listout('\r');
listout('\n');
if ( testkey() == ESCKEY ) {
error(" Listing aborted ");
goto ret1;
}
}
ret1:;
curson(YES);
calp();
return;
}
listout(c)
int c;
{
rdx = c;
rax = 05 << 8;
syscall();
return;
}